package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.AtributosService;
import co.gov.medellin.ssti.sub.model.service.BeneficiarioService;
import co.gov.medellin.ssti.sub.model.service.BeneficioService;
import co.gov.medellin.ssti.sub.model.service.InterfazMELService;
import co.gov.medellin.ssti.sub.model.service.RenovarService;
import co.gov.medellin.ssti.sub.model.service.RestriccionService;
import co.gov.medellin.ssti.sub.model.service.SubprogramaService;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.Beneficiario_AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.InterfazMELVO;
import co.gov.medellin.ssti.sub.model.vo.RenovarVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

@Component
public class RenovarMasivaOtorgarAction extends Action {
	@Autowired
	AtributosService atributosServiceImpl;
	@Autowired
	BeneficiarioService beneficiarioServiceImpl;
	@Autowired
	BeneficioService beneficioServiceImpl;
	@Autowired
	InterfazMELService interfazMELServiceImpl;
	@Autowired
	RenovarService renovarServiceImpl2;
	@Autowired
	RestriccionService restriccionServiceImpl;
	@Autowired
	SubprogramaService subprogramaServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		HttpSession session = request.getSession();

		// Proceso para la auditoria
		UserVO user = (UserVO) request.getSession().getAttribute("userInfo");
		String terminalAddress = request.getRemoteAddr();
		String strTerminal = ("WEB=" + terminalAddress);
		Calendar c = Calendar.getInstance();
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		// Fin del proceso
		String strCodeSubpro = (String) session.getAttribute("codBeneficio");
		List<BeneficiarioVO> lbeneficiarios = new LinkedList<BeneficiarioVO>();
		lbeneficiarios = (List<BeneficiarioVO>) session
				.getAttribute("LBeneficiarios");
		int NumBene = 0;
		boolean disponibilidad = true;
		// boolean insertar = true;

		// String strCodeProg = (String) session.getAttribute("CodePrograma");
		String strCodeSubPro = (String) session.getAttribute("CodeSubprograma");
		String strCodeSede = (String) session.getAttribute("CodeSede");
		String strEdad = null;
		// String strFechaActual = null;
		String strCodeAtriDate = null;
		String strPosition = null;

		int compara1 = 0;
		int compara2 = 0;
		// int continuar = 0;

		List<String> lAtriBeneficio = null;
		List<BeneficiarioVO> beneficiario = new LinkedList<BeneficiarioVO>();
		List<Beneficiario_AtributoVO> lInsertar = new LinkedList<Beneficiario_AtributoVO>();
		List<AtributoVO> lAtriNoRestric = new LinkedList<AtributoVO>();
		// List lAtriAlerta = new LinkedList();
		List<BeneficiarioVO> lError = new LinkedList<BeneficiarioVO>();
		List<BeneficiarioVO> lCorrecto = new LinkedList<BeneficiarioVO>();

		BeneficiarioVO beneVO = null;

		String strnombre = "";
		for (int i = 0; i < lbeneficiarios.size(); i++) {
			strnombre = "beneficiario" + i;
			Object valor = (Object) request.getParameter(strnombre);
			if (valor != null) {
				NumBene++;
			}
		}

		try {
			// Proceso para saber los dias de reutilizacion y los dias a renovar
			Long loCodigoSubp = new Long(strCodeSubpro);

			SubprogramaVO objsubproVO = new SubprogramaVO();
			objsubproVO = subprogramaServiceImpl
					.findPropiedadesSubprograma(loCodigoSubp);
			String reutilizar = objsubproVO.getDiasReutilizar();
			String renovacion = objsubproVO.getDiasRenovacion();
			int dreutilizar = Integer.parseInt(reutilizar.trim());
			int drenovacion = Integer.parseInt(renovacion.trim());
			double lreutilizar = dreutilizar;
			double lrenovacion = drenovacion;
			double total = lrenovacion / lreutilizar;
			long totaldias = Math.round(total);
			// Fin del proceso

			// Proceso para determinar si hay beneficios
			int disponible = beneficioServiceImpl.findDisponibilidad(new Long(
					strCodeSede), new Long(strCodeSubpro));

			if ((NumBene * Integer.parseInt(totaldias + "")) > disponible) {
				disponibilidad = false;
			}
			// Fin del proceso

			if (disponibilidad) {
				// Proceso para traer los atributos del beneficio
				Collection<AtributoVO> atributos = null;

				atributos = atributosServiceImpl.findAtributosSubprograma(
						Long.valueOf(strCodeSubPro), "A", 0);
				// fin del proceso
				for (int j = 0; j < lbeneficiarios.size(); j++) {
					lAtriBeneficio = new LinkedList<String>();
					lInsertar.removeAll(lInsertar);
					strnombre = "beneficiario" + j;
					String strCodeBeneficiario = "";
					Object valor = (Object) request.getParameter(strnombre);
					if (valor != null) {

						// Proceso para traer la informacion con la interfaz
						try {
							strCodeBeneficiario = request
									.getParameter(strnombre);
							SubprogramaVO subproVO = new SubprogramaVO();
							subproVO.setCode(new Long(strCodeSubpro));

							List<SubprogramaVO> subpro = (List<SubprogramaVO>) subprogramaServiceImpl
									.findSubprogramaByCriteria(subproVO,
											user.getCode(),
											user.getUserGroupName(),
											user.getCodeArea());
							// List lInsert = new LinkedList();
							if (subpro != null && subpro.size() > 0) {
								subproVO = (SubprogramaVO) subpro.get(0);
								if (subproVO.getValidarSisben().equals("S")) {
									// Buscando el beneficiario en la bd del
									// sisben
									beneVO = new BeneficiarioVO();
									beneVO.setCode(new Long(strCodeBeneficiario));

									try {
										beneficiario = (List<BeneficiarioVO>) beneficiarioServiceImpl
												.findBeneficiarioByCriteria(
														beneVO, "");
										if (beneficiario != null
												&& beneficiario.size() > 0) {
											beneVO = (BeneficiarioVO) beneficiario
													.get(0);
											BeneficiarioVO beneSisbenVO = new BeneficiarioVO();
											// empezando a buscar el
											// beneficiario en sisben por todos
											// los criterios
											beneSisbenVO
													.setTipoDocumento(beneVO
															.getTipoDocumento());
											beneSisbenVO
													.setNumeroDocumento(beneVO
															.getNumeroDocumento());
											beneSisbenVO.setNombre1(beneVO
													.getNombre1());
											beneSisbenVO.setNombre2(beneVO
													.getNombre2());
											beneSisbenVO
													.setPrimerApellido(beneVO
															.getPrimerApellido());
											beneSisbenVO
													.setSegundoApellido(beneVO
															.getSegundoApellido());
											beneSisbenVO
													.setFechaNacimiento(beneVO
															.getFechaNacimiento());
											List<BeneficiarioVO> beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
													.findBeneficiarioSisben(beneSisbenVO);
											boolean encontro = false;
											if (beneficiarioSisben != null
													&& beneficiarioSisben
															.size() > 0) {
												encontro = true;
											} else {
												beneSisbenVO = new BeneficiarioVO();
												beneSisbenVO.setNombre1(beneVO
														.getNombre1());
												beneSisbenVO.setNombre2(beneVO
														.getNombre2());
												beneSisbenVO
														.setPrimerApellido(beneVO
																.getPrimerApellido());
												beneSisbenVO
														.setSegundoApellido(beneVO
																.getSegundoApellido());
												beneSisbenVO
														.setFechaNacimiento(beneVO
																.getFechaNacimiento());
												beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
														.findBeneficiarioSisben(beneSisbenVO);
												if (beneficiarioSisben != null
														&& beneficiarioSisben
																.size() > 0) {
													encontro = true;
												} else {
													beneSisbenVO = new BeneficiarioVO();
													beneSisbenVO
															.setNumeroDocumento(beneVO
																	.getNumeroDocumento());
													beneSisbenVO
															.setNombre1(beneVO
																	.getNombre1());
													beneSisbenVO
															.setNombre2(beneVO
																	.getNombre2());
													beneSisbenVO
															.setPrimerApellido(beneVO
																	.getPrimerApellido());
													beneSisbenVO
															.setSegundoApellido(beneVO
																	.getSegundoApellido());
													beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
															.findBeneficiarioSisben(beneSisbenVO);
													if (beneficiarioSisben != null
															&& beneficiarioSisben
																	.size() > 0) {
														encontro = true;
													} else {
														beneSisbenVO = new BeneficiarioVO();
														beneSisbenVO
																.setNumeroDocumento(beneVO
																		.getNumeroDocumento());
														beneSisbenVO
																.setNombre1(beneVO
																		.getNombre1());
														beneSisbenVO
																.setPrimerApellido(beneVO
																		.getPrimerApellido());
														beneSisbenVO
																.setFechaNacimiento(beneVO
																		.getFechaNacimiento());
														beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
																.findBeneficiarioSisben(beneSisbenVO);
														if (beneficiarioSisben != null
																&& beneficiarioSisben
																		.size() > 0) {
															encontro = true;
														} else {
															beneSisbenVO = new BeneficiarioVO();
															beneSisbenVO
																	.setNumeroDocumento(beneVO
																			.getNumeroDocumento());
															beneSisbenVO
																	.setNombre1(beneVO
																			.getNombre1());
															beneSisbenVO
																	.setPrimerApellido(beneVO
																			.getPrimerApellido());
															beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
																	.findBeneficiarioSisben(beneSisbenVO);
															if (beneficiarioSisben != null
																	&& beneficiarioSisben
																			.size() > 0) {
																encontro = true;
															} else {
																beneSisbenVO = new BeneficiarioVO();
																beneSisbenVO
																		.setNumeroDocumento(beneVO
																				.getNumeroDocumento());
																beneSisbenVO
																		.setNombre2(beneVO
																				.getNombre2());
																beneSisbenVO
																		.setSegundoApellido(beneVO
																				.getSegundoApellido());
																beneSisbenVO
																		.setFechaNacimiento(beneVO
																				.getFechaNacimiento());
																beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
																		.findBeneficiarioSisben(beneSisbenVO);
																if (beneficiarioSisben != null
																		&& beneficiarioSisben
																				.size() > 0) {
																	encontro = true;
																} else {
																	beneSisbenVO = new BeneficiarioVO();
																	beneSisbenVO
																			.setTipoDocumento(beneVO
																					.getTipoDocumento());
																	beneSisbenVO
																			.setNumeroDocumento(beneVO
																					.getNumeroDocumento());
																	beneficiarioSisben = (List<BeneficiarioVO>) beneficiarioServiceImpl
																			.findBeneficiarioSisben(beneSisbenVO);
																	if (beneficiarioSisben != null
																			&& beneficiarioSisben
																					.size() > 0) {
																		encontro = true;
																		// session.setAttribute("ListaSisben",beneficiarioSisben);
																	}
																}
															}
														}
													}
												}
											}

											if (!encontro) {
												request.setAttribute(
														"msgsisben",
														"El beneficiario no se encontro en Sisben por lo tanto no se le puede otorgar un beneficio que valide contra Sisben.");
												return mapping
														.findForward("verbeneficio");
											} else {
												if (beneficiarioSisben.size() == 1) {
													if (subpro != null
															&& subpro.size() > 0) {
														subproVO = (SubprogramaVO) subpro
																.get(0);

														List<AtributoVO> atri = (List<AtributoVO>) atributos;
														if (atri != null
																&& atri.size() > 0) {
															AtributoVO atributo = null;
															beneVO = (BeneficiarioVO) beneficiarioSisben
																	.get(0);
															for (int i = 0; i < atri
																	.size(); i++) {
																atributo = (AtributoVO) atri
																		.get(i);

																if (atributo
																		.getNombre()
																		.equals("NIVEL SISBEN")) {
																	lAtriBeneficio
																			.add("NIVEL SISBEN");
																	lAtriBeneficio
																			.add(beneVO
																					.getNivelSisben());
																}
																if (atributo
																		.getNombre()
																		.equals("PUNTAJE")) {
																	lAtriBeneficio
																			.add("PUNTAJE");
																	lAtriBeneficio
																			.add(beneVO
																					.getPuntajeSisben());
																}
															}
														}
													}
												}
											}
										}

									} catch (DAOException e) {
										SUBException.logDebugError("", e);
									}
									// fin interfaz SISBEN
								}
							}

							// inicio interfaz MATRICULA EN LINEA

							if (subpro != null && subpro.size() > 0) {
								subproVO = (SubprogramaVO) subpro.get(0);
								if (subproVO.getValidarEstud().equals("S")) {
									beneVO = new BeneficiarioVO();
									beneVO.setCode(new Long(strCodeBeneficiario));

									boolean encontro = false;
									try {
										beneficiario = (List<BeneficiarioVO>) beneficiarioServiceImpl
												.findBeneficiarioByCriteria(
														beneVO, "");
										if (beneficiario != null
												&& beneficiario.size() > 0) {
											beneVO = (BeneficiarioVO) beneficiario
													.get(0);
											BeneficiarioVO beneMLVO = new BeneficiarioVO();
											// empezando a buscar el
											// beneficiario en ML por tipo y
											// numero de documento
											beneMLVO.setTipoDocumento(beneVO
													.getTipoDocumento());
											beneMLVO.setNumeroDocumento(beneVO
													.getNumeroDocumento());
											List<BeneficiarioVO> beneficiarioMEL = (List<BeneficiarioVO>) beneficiarioServiceImpl
													.findBeneficiarioMEL(beneMLVO);

											if (beneficiarioMEL != null
													&& beneficiarioMEL.size() > 0) {
												encontro = true;

												List<InterfazMELVO> camposMEL = (List<InterfazMELVO>) interfazMELServiceImpl
														.findCamposGenericos(beneVO);
												if (camposMEL != null
														&& camposMEL.size() > 0) {
													List<AtributoVO> atri = (List<AtributoVO>) atributos;
													if (atri != null
															&& atri.size() > 0) {
														AtributoVO atributo = null;
														InterfazMELVO MELVO = (InterfazMELVO) camposMEL
																.get(0);
														for (int i = 0; i < atri
																.size(); i++) {
															atributo = (AtributoVO) atri
																	.get(i);
															if (atributo
																	.getNombre()
																	.equals("NOMBRE PADRE")) {
																lAtriBeneficio
																		.add("NOMBRE PADRE");
																lAtriBeneficio
																		.add(MELVO
																				.getNomPadre());
															}
															if (atributo
																	.getNombre()
																	.equals("CEDULA PADRE")) {
																lAtriBeneficio
																		.add("CEDULA PADRE");
																lAtriBeneficio
																		.add(MELVO
																				.getCedulaPadre());
															}
															if (atributo
																	.getNombre()
																	.equals("TELEFONO PADRE")) {
																lAtriBeneficio
																		.add("TELEFONO PADRE");
																lAtriBeneficio
																		.add(MELVO
																				.getTelPadre());
															}
															if (atributo
																	.getNombre()
																	.equals("NOMBRE MADRE")) {
																lAtriBeneficio
																		.add("NOMBRE MADRE");
																lAtriBeneficio
																		.add(MELVO
																				.getNomMadre());
															}
															if (atributo
																	.getNombre()
																	.equals("CEDULA MADRE")) {
																lAtriBeneficio
																		.add("CEDULA MADRE");
																lAtriBeneficio
																		.add(MELVO
																				.getCedulaMadre());
															}
															if (atributo
																	.getNombre()
																	.equals("TELEFONO MADRE")) {
																lAtriBeneficio
																		.add("TELEFONO MADRE");
																lAtriBeneficio
																		.add(MELVO
																				.getTelMadre());
															}
															if (atributo
																	.getNombre()
																	.equals("NOMBRE ACUDIENTE")) {
																lAtriBeneficio
																		.add("NOMBRE ACUDIENTE");
																lAtriBeneficio
																		.add(MELVO
																				.getNomAcu());
															}
															if (atributo
																	.getNombre()
																	.equals("CEDULA ACUDIENTE")) {
																lAtriBeneficio
																		.add("CEDULA ACUDIENTE");
																lAtriBeneficio
																		.add(MELVO
																				.getCedulaAcu());
															}
															if (atributo
																	.getNombre()
																	.equals("TELEFONO ACUDIENTE")) {
																lAtriBeneficio
																		.add("TELEFONO ACUDIENTE");
																lAtriBeneficio
																		.add(MELVO
																				.getTelAcu());
															}
															if (atributo
																	.getNombre()
																	.equals("INSTITUCI�N EDUCATIVA")) {
																lAtriBeneficio
																		.add("INSTITUCI�N EDUCATIVA");
																lAtriBeneficio
																		.add(MELVO
																				.getNomInstitucion());
															}
															if (atributo
																	.getNombre()
																	.equals("DIRECCI�N INST. EDUCATIVA")) {
																lAtriBeneficio
																		.add("DIRECCI�N INST. EDUCATIVA");
																lAtriBeneficio
																		.add(MELVO
																				.getDirInstitucion());
															}
															if (atributo
																	.getNombre()
																	.equals("TELEFONO INST. EDUCATIVA")) {
																lAtriBeneficio
																		.add("TELEFONO INST. EDUCATIVA");
																lAtriBeneficio
																		.add(MELVO
																				.getTelInstitucion());
															}
															if (atributo
																	.getNombre()
																	.equals("NOMBRE SEDE")) {
																lAtriBeneficio
																		.add("NOMBRE SEDE");
																lAtriBeneficio
																		.add(MELVO
																				.getNomSede());
															}
															if (atributo
																	.getNombre()
																	.equals("DIRECCION SEDE")) {
																lAtriBeneficio
																		.add("DIRECCION SEDE");
																lAtriBeneficio
																		.add(MELVO
																				.getDirSede());
															}
															if (atributo
																	.getNombre()
																	.equals("TELEFONO SEDE")) {
																lAtriBeneficio
																		.add("TELEFONO SEDE");
																lAtriBeneficio
																		.add(MELVO
																				.getTelSede());
															}
															if (atributo
																	.getNombre()
																	.equals("GRADO")) {
																lAtriBeneficio
																		.add("GRADO");
																lAtriBeneficio
																		.add(MELVO
																				.getGrado());
															}
															if (atributo
																	.getNombre()
																	.equals("JORNADA")) {
																lAtriBeneficio
																		.add("JORNADA");
																lAtriBeneficio
																		.add(MELVO
																				.getJornada());
															}
															if (atributo
																	.getNombre()
																	.equals("NUCLEO EDUCATIVO")) {
																lAtriBeneficio
																		.add("NUCLEO EDUCATIVO");
																lAtriBeneficio
																		.add(MELVO
																				.getNucleo());
															}
														}
														// int ss = 0;
													}
												}

											}
										}

									} catch (DAOException e) {
										SUBException.logDebugError("", e);
									}

									if (!encontro) {
										request.setAttribute(
												"msgmel",
												"El beneficiario no se encontro en Matricula en Linea por lo tanto no se le puede otorgar un beneficio que valide contra Matricula en Linea.");
										return mapping
												.findForward("verbeneficio");
									}
								}
							}

							// fin interfaz MATRICULA EN LINEA

							// proceso que traer el resto de la informacion
							List<AtributoVO> latributos = (List<AtributoVO>) renovarServiceImpl2
									.findAtributosSubpro(new Long(strCodeSubPro));
							List<String> lBotSede = (List<String>) renovarServiceImpl2
									.findBeneficioOtorgado(new Long(
											strCodeSubPro), new Long(
											strCodeBeneficiario));

							session.setAttribute("codesede",
									(String) lBotSede.get(1));
							for (int i = 0; i < latributos.size(); i++) {
								AtributoVO atrivo = new AtributoVO();
								atrivo = (AtributoVO) latributos.get(i);
								/*
								 * if(atrivo.getTipoatributo().equals("R")) {
								 */
								if ((atrivo.getNombre()).equals("EDAD")) {
									BeneficiarioVO objBeneVO = new BeneficiarioVO();
									objBeneVO = (BeneficiarioVO) lbeneficiarios
											.get(j);

									strEdad = beneficiarioServiceImpl
											.findEdad(objBeneVO.getCode());
									if (strEdad != null && !strEdad.equals("")) {
										// Proceso para calcular la edad
										/*
										 * Calendar calendario=
										 * Calendar.getInstance();
										 * strFechaActual
										 * =(calendario.get(Calendar
										 * .DAY_OF_MONTH
										 * )<10?"0":"")+calendario.get
										 * (Calendar.DAY_OF_MONTH)+"/"+
										 * ((calendario
										 * .get(Calendar.MONTH)+1)<10
										 * ?"0":"")+(calendario
										 * .get(Calendar.MONTH
										 * )+1)+"/"+calendario
										 * .get(Calendar.YEAR);
										 * 
										 * String ArrFechaActual[] =
										 * strFechaActual.split("/"); String
										 * strDayAc = ArrFechaActual[0]; String
										 * strMonthAc = ArrFechaActual[1];
										 * String strYearAc = ArrFechaActual[2];
										 * 
										 * String ArrFechaNacimiento[] =
										 * strFechaNacimiento.split("/"); String
										 * strDayNa = ArrFechaNacimiento[0];
										 * String strMonthNa =
										 * ArrFechaNacimiento[1]; String
										 * strYearNa = ArrFechaNacimiento[2];
										 * 
										 * //resto los a�os de las dos fechas
										 * int iEdad =
										 * Integer.parseInt(strYearAc) -
										 * Integer.parseInt(strYearNa) - 1; //-1
										 * porque no se si ha cumplido a�os ya
										 * este a�o
										 * 
										 * //si resto los meses y me da menor
										 * que 0 entonces no ha cumplido a�os.
										 * Si da mayor si ha cumplido if
										 * (((Integer.parseInt(strMonthAc)) -
										 * (Integer.parseInt(strMonthNa))) > 0)
										 * iEdad +=1;
										 * 
										 * if (((Integer.parseInt(strMonthAc)) -
										 * (Integer.parseInt(strMonthNa))) == 0)
										 * { //si resto los dias y me da menor
										 * que 0 entonces no ha cumplido a�os.
										 * Si da mayor o igual si ha cumplido if
										 * (((Integer.parseInt(strDayAc)) -
										 * (Integer.parseInt(strDayNa))) >= 0)
										 * iEdad +=1; }
										 */
										lAtriBeneficio.add(atrivo.getNombre());
										lAtriBeneficio.add(strEdad);
										// lAtriBeneficio.add(String.valueOf(iEdad));
										// Fin del proceso
									} else {
										/*
										 * objRenovar = new RenovarDAO(cf);
										 * String strValor =
										 * objRenovar.Getbeneficiarioatri
										 * (atrivo.
										 * getTipodato(),strCodeBeneficiario
										 * ,atrivo.getCodatributo());
										 * cf.closeConnection
										 * (objRenovar.getConn()); RenovarVO
										 * renovarvo = new RenovarVO();
										 * 
										 * if(strValor != null &&
										 * !strValor.equals("")) {
										 * lAtriBeneficio
										 * .add(atrivo.getNombre());
										 * lAtriBeneficio.add(strValor); }else {
										 * lAtriBeneficio
										 * .add(atrivo.getNombre());
										 * lAtriBeneficio.add(""); }
										 */

										if (lBotSede.size() > 0) {
											String strBeneOtor = (String) lBotSede
													.get(0);
											RenovarVO renovarVO = renovarServiceImpl2
													.findBeneficioAtri(
															atrivo.getTipodato(),
															new Long(
																	strBeneOtor),
															new Long(
																	atrivo.getCodatributo()));
											// RenovarVO renovarvo = new
											// RenovarVO();
											if (renovarVO != null) {
												lAtriBeneficio.add(atrivo
														.getNombre());
												lAtriBeneficio.add(renovarVO
														.getValor());
											} else {
												lAtriBeneficio.add(atrivo
														.getNombre());
												lAtriBeneficio.add("");
											}
										}
									}
									/*
									 * }else { objRenovar = new RenovarDAO(cf);
									 * String strValor =
									 * objRenovar.Getbeneficiarioatri
									 * (atrivo.getTipodato
									 * (),strCodeBeneficiario,
									 * atrivo.getCodatributo());
									 * cf.closeConnection(objRenovar.getConn());
									 * RenovarVO renovarvo = new RenovarVO();
									 * if(strValor != null &&
									 * !strValor.equals("")) {
									 * lAtriBeneficio.add(atrivo.getNombre());
									 * lAtriBeneficio.add(strValor); }else {
									 * lAtriBeneficio.add(atrivo.getNombre());
									 * lAtriBeneficio.add(""); } }
									 */
								} else {
									if (lBotSede.size() > 0) {
										String strBeneOtor = (String) lBotSede
												.get(0);
										RenovarVO renovarVO = renovarServiceImpl2
												.findBeneficioAtri(
														atrivo.getTipodato(),
														new Long(strBeneOtor),
														new Long(
																atrivo.getCodatributo()));
										// RenovarVO renovarvo = new
										// RenovarVO();
										if (renovarVO != null) {
											lAtriBeneficio.add(atrivo
													.getNombre());
											lAtriBeneficio.add(renovarVO
													.getValor());
										} else {
											lAtriBeneficio.add(atrivo
													.getNombre());
											lAtriBeneficio.add("");
										}
									}
								}
							}

							// fin del proceso

							// Proceso para validar restricciones
							if (atributos.size() > 0) {
								int tamanolatri = atributos.size();
								List<AtributoVO> lAtributo = (List<AtributoVO>) atributos;
								for (int i = 0; i < tamanolatri; i++) {
									Beneficiario_AtributoVO objBenAtriVO = new Beneficiario_AtributoVO();
									AtributoVO atrirestri = (AtributoVO) lAtributo
											.get(i);
									String strCodiAtri = atrirestri
											.getCodatributo();
									String strCodiRest = atrirestri
											.getRestriccion();
									String strTipoAtri = atrirestri
											.getTipoatributo();
									String strNombre = atrirestri.getNombre();
									String tipodato = atrirestri.getTipodato();
									String variable = "";

									for (int k = 0; k < lAtriBeneficio.size(); k += 2) {
										String strNombre2 = (String) lAtriBeneficio
												.get(k);
										if (strNombre.equals(strNombre2)) {
											variable = (String) lAtriBeneficio
													.get(k + 1);
											break;
										}
									}

									if ((Object) strCodiRest != null) {
										try {
											String ArrRest[] = restriccionServiceImpl
													.validarRestriccion(
															strCodiAtri,
															strCodiRest,
															variable, tipodato);

											if (ArrRest[0].equals("N")) {
												if (ArrRest[1].equals("true")) {

													session.setAttribute(
															"mensajes", "1");

													if (strTipoAtri.equals("R")) {
														objBenAtriVO
																.setVariable(variable);
														objBenAtriVO
																.setTipodato(tipodato);
														objBenAtriVO
																.setCodigoatributo(strCodiAtri);
														objBenAtriVO
																.setCodbeneficiario(strCodeBeneficiario);
														objBenAtriVO
																.setTipoatributo(strTipoAtri);
														lInsertar
																.add(objBenAtriVO);

													} else {
														objBenAtriVO
																.setVariable(variable);
														objBenAtriVO
																.setTipodato(tipodato);
														objBenAtriVO
																.setCodigoatributo(strCodiAtri);
														objBenAtriVO
																.setTipoatributo(strTipoAtri);
														lInsertar
																.add(objBenAtriVO);

													}
												} else {
													// insertar = false;

													session.setAttribute(
															"mensajes", "2");
													atrirestri
															.setDescrest(ArrRest[2]);
													String ver = atrirestri
															.getDescrest();
													int sw1 = 0;
													for (int k = 0; k < lAtriNoRestric
															.size(); k++) {
														AtributoVO atribVO = new AtributoVO();
														atribVO = (AtributoVO) lAtriNoRestric
																.get(k);
														String strCodeRest = atribVO
																.getCodigo();
														if (atribVO
																.getRestriccion()
																.equals(strCodiRest)) {
															sw1 = 1;
															break;
														}
													}
													if (sw1 == 0)
														lAtriNoRestric
																.add(atrirestri);

												}
											} else {
												if (ArrRest[1].equals("false")) {
													session.setAttribute(
															"mensajes", "3");
													atrirestri
															.setDescrest(ArrRest[2]);
													int sw1 = 0;
													for (int k = 0; k < lAtriNoRestric
															.size(); k++) {
														AtributoVO atribVO = new AtributoVO();
														atribVO = (AtributoVO) lAtriNoRestric
																.get(k);
														String strCodeRest = atribVO
																.getCodigo();
														if (atribVO
																.getRestriccion()
																.equals(strCodiRest)) {
															sw1 = 1;
															break;
														}
													}
													if (sw1 == 0)
														lAtriNoRestric
																.add(atrirestri);

												}
												if (strTipoAtri.equals("R")) {
													objBenAtriVO
															.setVariable(variable);
													objBenAtriVO
															.setTipodato(tipodato);
													objBenAtriVO
															.setCodigoatributo(strCodiAtri);
													objBenAtriVO
															.setCodbeneficiario(strCodeBeneficiario);
													objBenAtriVO
															.setTipoatributo(strTipoAtri);
													lInsertar.add(objBenAtriVO);
												} else {
													objBenAtriVO
															.setVariable(variable);
													objBenAtriVO
															.setTipodato(tipodato);
													objBenAtriVO
															.setCodigoatributo(strCodiAtri);
													objBenAtriVO
															.setTipoatributo(strTipoAtri);
													lInsertar.add(objBenAtriVO);
												}
											}
										} catch (DAOException e) {
											SUBException.logDebugError("", e);
										}
									} else {
										if (strTipoAtri.equals("R")) {
											objBenAtriVO.setVariable(variable);
											objBenAtriVO.setTipodato(tipodato);
											objBenAtriVO
													.setCodigoatributo(strCodiAtri);
											objBenAtriVO
													.setCodbeneficiario(strCodeBeneficiario);
											objBenAtriVO
													.setTipoatributo(strTipoAtri);
											lInsertar.add(objBenAtriVO);
										} else {
											objBenAtriVO.setVariable(variable);
											objBenAtriVO.setTipodato(tipodato);
											objBenAtriVO
													.setCodigoatributo(strCodiAtri);
											objBenAtriVO
													.setTipoatributo(strTipoAtri);
											lInsertar.add(objBenAtriVO);
										}
									}
								}
							}
							// Fin del proceso

							if (lAtriNoRestric.size() == 0) {
								// Proceso para validar campos obligatorios
								List<AtributoVO> latri = (List<AtributoVO>) atributos;
								int sw = 0;
								for (int f = 0; f < latri.size(); f++) {
									AtributoVO atri = (AtributoVO) latri.get(f);
									String obligacion = atri.getObligatorio();
									String codAtri1 = atri.getCodatributo();
									if (obligacion.equals("S")) {
										for (int g = 0; g < lInsertar.size(); g++) {
											compara1++;
											Beneficiario_AtributoVO batrivo = new Beneficiario_AtributoVO();
											batrivo = (Beneficiario_AtributoVO) lInsertar
													.get(g);
											String codAtri2 = batrivo
													.getCodigoatributo();
											if (codAtri1.equals(codAtri2)) {
												if (!batrivo.getVariable()
														.equals("")) {
													compara2++;
													break;
												} else {
													BeneficiarioVO benefVO = (BeneficiarioVO) lbeneficiarios
															.get(j);
													lError.add(benefVO);
													sw = 1;
													break;
												}
											}
										}
										if (sw == 1) {
											break;
										}
									}
								}
								// Fin del proceso
							} else {
								request.setAttribute("msgrest",
										"Es posible que algunos campos no cumplan con las siguientes restricciones");
							}
						} catch (DAOException e) {
							SUBException.logDebugError("", e);
						}
						// Fin del proceso
						if ((lAtriNoRestric.size() > 0)) {
							BeneficiarioVO benefVO = (BeneficiarioVO) lbeneficiarios
									.get(j);
							lError.add(benefVO);
						} else {

							if (compara1 == compara2) {
								// Proceso para insetar en la tabla beneficio
								// otorgado

								Long loCodigoSede = new Long(strCodeSede);
								Long loCodigoBenefi = new Long(
										strCodeBeneficiario);

								// Proceso para identificar si el beneficio
								// tiene el atributo EDAD
								for (int i = 0; i < lInsertar.size(); i++) {
									Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO) lInsertar
											.get(i);
									String strNameAtri = atributosServiceImpl
											.findNombreAtributoSAB(new Long(
													objBenefiVO
															.getCodigoatributo()));
									if (strNameAtri != null
											&& !strNameAtri.equals("")) {
										if (strNameAtri.equals("EDAD")) {
											strCodeAtriDate = objBenefiVO
													.getCodigoatributo();
											strPosition = String.valueOf(i);
											break;
										}
									}
								}
								// Fin del proceso

								// Proceso para obtener el valor del beneficio
								String strCostBene = null;
								strCostBene = beneficioServiceImpl
										.findCostoBeneficio(new Long(
												strCodeSubpro));
								if (strCostBene != null) {
									request.setAttribute("CostBene",
											strCostBene);
								}
								// Fin del proceso

								// Proceso para convertir la fecha
								String strDateBenefit = dateFormat.format(c
										.getTime());
								// Fin del proceso
								int d = 0;
								boolean insertbien = false;
								String strArrAct[] = { user.getName(),
										strTerminal };
								for (int i = 0; i < totaldias; i++) {
									insertbien = beneficioServiceImpl
											.otorgarBeneficios(loCodigoSede,
													loCodigoSubp,
													loCodigoBenefi, lInsertar,
													"", d, strArrAct,
													strCostBene, strDateBenefit);
									d += dreutilizar;
									if (strCodeAtriDate != null
											&& !strCodeAtriDate.equals("")) {

										// Proceso para calcular la edad al
										// momento de otorgar el otro beneficio
										/*
										 * AtributosDAO objAtriDAO = new
										 * AtributosDAO(cf); String strDate =
										 * objAtriDAO
										 * .GetDateBeneficio(String.valueOf(d));
										 * cf
										 * .closeConnection(objAtriDAO.getConn(
										 * ));
										 * 
										 * String ArrFechaActual[] =
										 * strDate.split("/"); String strDayAc =
										 * ArrFechaActual[0]; String strMonthAc
										 * = ArrFechaActual[1]; String strYearAc
										 * = ArrFechaActual[2];
										 * 
										 * String ArrFechaNacimiento[] =
										 * strFechaNacimiento.split("/"); String
										 * strDayNa = ArrFechaNacimiento[0];
										 * String strMonthNa =
										 * ArrFechaNacimiento[1]; String
										 * strYearNa = ArrFechaNacimiento[2];
										 * 
										 * //resto los a�os de las dos fechas
										 * int iEdad =
										 * Integer.parseInt(strYearAc) -
										 * Integer.parseInt(strYearNa) - 1; //-1
										 * porque no se si ha cumplido a�os ya
										 * este a�o
										 * 
										 * //si resto los meses y me da menor
										 * que 0 entonces no ha cumplido a�os.
										 * Si da mayor si ha cumplido if
										 * (((Integer.parseInt(strMonthAc)) -
										 * (Integer.parseInt(strMonthNa))) > 0)
										 * iEdad +=1;
										 * 
										 * if (((Integer.parseInt(strMonthAc)) -
										 * (Integer.parseInt(strMonthNa))) == 0)
										 * { //si resto los dias y me da menor
										 * que 0 entonces no ha cumplido a�os.
										 * Si da mayor o igual si ha cumplido if
										 * (((Integer.parseInt(strDayAc)) -
										 * (Integer.parseInt(strDayNa))) >= 0)
										 * iEdad +=1; }
										 */

										// Fin del Proceso

										// Proceso para asignar el nuevo valor
										Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO) lInsertar
												.get(Integer
														.parseInt(strPosition));
										objBenefiVO.setVariable(String
												.valueOf(strEdad));
										objBenefiVO.setTipodato(objBenefiVO
												.getTipodato());
										objBenefiVO
												.setCodigoatributo(objBenefiVO
														.getCodigoatributo());
										objBenefiVO
												.setCodbeneficiario(objBenefiVO
														.getCodbeneficiario());
										objBenefiVO
												.setCodbeneotorgado(objBenefiVO
														.getCodbeneotorgado());
										objBenefiVO.setTipoatributo(objBenefiVO
												.getTipoatributo());

										lInsertar.remove((Integer
												.parseInt(strPosition)));
										strPosition = String.valueOf(lInsertar
												.size());
										lInsertar.add(objBenefiVO);
										// Fin del proceso
									}
									// //////////////////////////////////

								}
								if (insertbien) {
									BeneficiarioVO benefVO = (BeneficiarioVO) lbeneficiarios
											.get(j);
									lCorrecto.add(benefVO);
								}
								// fin del proceso
							} else {
								request.setAttribute("msgoblig",
										"Es posible que hayan campos vacios y que son obligatorios");
							}
						}
					}
				}
				if (lError.size() > 0)
					request.setAttribute("ListaError", lError);
				if (lCorrecto.size() > 0)
					request.setAttribute("ListaCorrectos", lCorrecto);
				if (lAtriNoRestric.size() > 0)
					request.setAttribute("ListaNoRestric", lAtriNoRestric);
			} else {
				request.setAttribute("msgdisp",
						"No hay beneficios disponibles en la sede seleccionada.");
			}
		} catch (Exception e) {
			SUBException.logDebugError("", e);
		}

		return mapping.findForward("success");
	}
}